package com.util.annotate;




import java.lang.annotation.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 注解类
 * 代码参考：https://www.jianshu.com/p/a4c58e12d3d8
 * 注解意思参考：https://blog.csdn.net/qq1404510094/article/details/80577555
 *
 */
public class Annotate {
}
    @Documented //注解是否包含在JAVADOC中
    @Target({ElementType.TYPE,ElementType.METHOD})//使用目标在类，接口，枚举和方法中
    @Retention(RetentionPolicy.RUNTIME)//运行时保留
@interface xiaoming{
    String name() default "小明";//表示默认为小明
}

/**
 * 给类的属性赋值
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@interface assignment{
    //注解的成员变量，以这种形式书写，注解没有成员方法。
    //成员变量没有默认值时，使用该注解必须给变量赋值。
    String value();//定义
}

/**
 * 获取方法的注解
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface fuck{

}

/**
 * 执行注解的方法
  */
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface tiancai{

        }

@xiaoming
class AnnotionTest{
    @assignment(value="日你妈")
    public String name;
    public static void ming(){

        boolean hasAnnotion = AnnotionTest
                .class //得到class对象
                .isAnnotationPresent(xiaoming.class);//注解是否在此类上
        if(hasAnnotion){
            xiaoming ming = AnnotionTest
                    .class
                    .getAnnotation(xiaoming.class); //获取指定注解
            System.out.println(ming.name());
        }
        }

    /**
     * 给类的属性赋值
     */
    public static void assign(){
            try {
                Field field = AnnotionTest
                        .class
                        .getDeclaredField("name");//该类的字段
                field.setAccessible(true);
                assignment assign = field
                        .getAnnotation(assignment.class);
                if(assign != null){
                    System.out.println("类成员赋值为："+assign.value());
                }
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }

        }
        @fuck
    public void ripi(){
        System.out.println("我要日批");
    }

    /**
     * 获取方法上的注解
     */
    public static void huoqu(){
        try {
            Method method = AnnotionTest
                    .class
                    .getDeclaredMethod("ripi");
            if(method != null){
                Annotation[] annotations = method.getAnnotations();
                for(int i = 0;i<annotations.length;i++){
                    System.out.println("获取的注解名:"+annotations[i]
                    .annotationType()
                    .getSimpleName()
                    );
                }
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
    @tiancai
    public static void t1(){
        System.out.println("天天吃欢笑");
    }
    @tiancai
    public static void t2(){
        System.out.println("天天日美丽");
    }
    public static void t3(){
        System.out.println("天天有得玩儿");
    }

    /**
     * 执行注解过的方法
     */
    public static void t4(){
        AnnotionTest annotionTest = new AnnotionTest();
        Method[] method = annotionTest
                .getClass()
                .getDeclaredMethods();//返回方法数组
        for (int i = 0; i<method.length;i++){
            Method meth = method[i];
            if(meth.isAnnotationPresent(tiancai.class)){//注解是否在此方法上 只有加上注解的方法才会被执行。
                try {
                    meth.setAccessible(true);//java语言访问查检 true为取消检查  false为启用检查
                    meth.invoke(annotionTest,"");//调用方法
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }
        System.out.println("天天吃奶奶完成");
    }
    public static void main(String[] args) {
        ming();
        assign();
        huoqu();
        t4();
        AnnotionTest annotionTest = new AnnotionTest();
        System.out.println(annotionTest.name);
    }
}
